package com.ollama.study.controller;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.ollama.api.OllamaOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController // 标记该类为Rest风格的控制器，返回的数据会自动序列化为JSON格式
@RequestMapping("/ollamachat")// 映射所有请求方式的 /ollamachat 路径
@Tag(name = "ollama聊天模型")  // Swagger注解，给该控制器的接口打上“用户管理”标签，便于文档分组显示
public class OllamaChatController {

    @Resource(name = "ollamaChatModelD1")
    private OllamaChatModel ollamaChatModel;

    @Value("${spring.ai.ollama.base-url}")
    private String OLLAMA_BASE_URL;// 获取配置文件中的ollama的base-url

    @Value("${spring.ai.ollama.chat.model}")
    private String OLLAMA_MODEL_NAME;// 获取配置文件中的ollama的chat.model

    @GetMapping(value = "/chat",produces = "text/plain;charset=UTF-8")
    public String basicChat(@RequestParam(value = "message", defaultValue = "你是谁") String message) {
        ChatResponse response = ollamaChatModel.call(new Prompt(message));
        return response.getResult().getOutput().getText();
    }

    /**
     * 指定模型的聊天接口，可选择模型并设置参数
     * @param message 用户输入的消息
     * @return 模型响应内容
     */
    @GetMapping(value = "/chatMode", produces = "text/plain;charset=UTF-8")
    public String chatWithSpecificModel(@RequestParam(value = "message", defaultValue = "你是谁") String message) {
        ChatResponse response = ollamaChatModel.call(
                new Prompt(message,
                        OllamaOptions.builder()
                                .model(OLLAMA_MODEL_NAME)
                                .temperature(0.4)
                                .build()
                ));
        String ResponseResult = response.getResult().getOutput().getText();
        return ResponseResult;
    }

    /**
     * 使用ChatClient的聊天接口，展示更灵活的调用方式
     * @param message 用户输入的消息
     * @return 模型响应内容
     */
    @GetMapping(value = "/chatClient",produces = "text/plain;charset=UTF-8")
    public String chatUsingClient(@RequestParam(value = "message", defaultValue = "你是谁") String message) {
        String result = ChatClient.create(this.ollamaChatModel)
                .prompt(message)
                .options(OllamaOptions.builder().model(OLLAMA_MODEL_NAME).build())
                .call()
                .content();
        return result;
    }
    // 本质来说以上的三个都是测试版本的代码,确定是可以使用的，但是目前不符合实际的需要因此需要进行进一步的调整
    /*
     * 在上一篇文章中，我们介绍了如何使用 SoringAl框架与 Olama2进行集成，并通过 chatclient 和 ollamachatModel 实现了基础对话功能。
     * 然而，在实际的企业级应用中，仅仅实现单轮对话是远远不够的。为了让 A1聊天机器人Q具备“记忆力"，能够理解上下文并进行连贯的多轮对话，
     * 我们需要引入上下文管理机制。本文将详细介绍如何构建一个支持上下文记忆的 Ollama 聊天服务。
     * */


}
